package daos;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import tabelas.Curso;
import tabelas.Estudante;

public class EstudanteDAO 
{	
	public static void salva(Estudante e) 
	{
		try {
			Connection c = Conexao.get();
			
			c.createStatement().executeUpdate("insert into estudante (nome) values ( '"+ e.getNome()+"')");
			
			c.commit();
		} catch (SQLException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
	}
	
	public static Estudante carrega(Integer id) 
	{
		Estudante e = null;
		try {
			e = new Estudante();
			ResultSet result = Conexao.get().createStatement().executeQuery("select * from estudante where id = "+id.toString());
			
			if(result.next() == false)
				return null;
			
			e.setId(result.getInt("id"));
			e.setNome(result.getString("nome"));
			
			if(result.getInt("curso_id") != 0) //se o ID nao for nulo, ou seja, tem um curso
			{
				e.setCurso(CursoDAO.carrega(result.getInt("curso_id")));
			}
				
			
		} catch (SQLException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		
		return e;
	}
	
	public static Estudante carregaEspecial(Integer id, Curso curso)
	{
		Estudante e = null;
		try {
			e = new Estudante();
			ResultSet result = Conexao.get().createStatement().executeQuery("select * from estudante where id = "+id.toString());
			
			if(result.next() == false)
				return null;
			
			e.setId(result.getInt("id"));
			e.setNome(result.getString("nome"));
			
			if(result.getInt("curso_id") != 0) //se o ID nao for nulo, ou seja, tem um curso
			{
				e.setCurso(curso);
			}
				
			
		} catch (SQLException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		
		return e;
	}

	public static void atualiza(Estudante e) {
		try {
			Connection c = Conexao.get();
			
			c.createStatement().executeUpdate("update estudante set nome = '"+ e.getNome()+"', curso_id = '" + e.getCurso().getId() + 
											"' where id = " + e.getId().toString());
			
			c.commit();
		} catch (SQLException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
	}
	
	public static void exclui(Estudante e)
	{
		try {
			Connection c = Conexao.get();
			
			c.createStatement().executeUpdate("delete from estudante where id = " + e.getId().toString());
			
			c.commit();
		} catch (SQLException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
	}
	
	//TODO ta dando erro
	public static Set<Estudante> lista()
	{
		return listaPorCurso(null);
	}
	
	//TODO ta dando erro
	public static Set<Estudante> listaPorCurso(Curso curso)
	{
		Set<Estudante> set = new HashSet<Estudante>();
		
		Set<Curso> cursosInstanciados = new HashSet<Curso>();
		
		try {
			ResultSet result;
			if(curso == null)
				result = Conexao.get().createStatement().executeQuery("select * from estudante");
			else
				result = Conexao.get().createStatement().executeQuery("select * from estudante where curso_id = "+curso.getId().toString());
			
			while(result.next() == true)
			{
				for(Estudante e : set)
					if(e.getId().equals(result.getInt("id")))
						continue;
				
				Estudante e = new Estudante();
				e.setId(result.getInt("id"));
				e.setNome(result.getString("nome"));
				set.add(e);
				if(result.getInt("curso_id") != 0) //se o ID nao for nulo, ou seja, tem um curso
				{
					boolean naoTem = true;
					for(Curso c1 : cursosInstanciados)
						if(c1.getId().equals(result.getInt("curso_id")))
						{
							e.setCurso(c1);
							naoTem = false;
							break;
						}
						
					if(naoTem)
					{
						Curso c = CursoDAO.carregaEspecial(result.getInt("curso_id"), set);
						
						e.setCurso(c);
						
						cursosInstanciados.add(c);
					}
				}
			}
			
		} catch (SQLException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		
		if(curso != null) 
			for(Iterator<Estudante> it = set.iterator(); it.hasNext() ; )
			{
				Estudante e = it.next();
				if(e.getCurso().getId() != curso.getId())
					set.remove(e);
			}
		return set;
	}
	
}
